# -*- coding: utf-8 -*-

'''
    autor: João Rebocho Nº 6035
    data: 8/10/2014
    obs: Trabalho Prático LP 2014/2015
'''

import sqlite3
from xlrd import open_workbook
import math
from Estatistica_Folha1 import*

class Ler_Dados_E_Escrever:
    
    def __init__(self, anoInicial, anoFinal):
        '''
        Construtor da classe Ler_Dados_e_Escrever
        sanoinicial - e uma variavel de tipo inteiro e vai indicar o ano inicial para 
                        as várias estatisticas(esta variavel pode assumir valores entre 0 e 36)
        anofinal - e uma variavel de tipo inteiro e vai indicar o ano final para 
                        as várias estatisticas (esta variavel pode assumir valores entre 0 e 36)
        
        '''
        self.anoInicial = anoInicial
        self.anoFinal = anoFinal
        pass
    
    def ler_fich_exel(self):
        '''
        Neste metodo leio o ficheiro exel IPC_Portugal_1977_2013.xls
        e guardo os valores deste ficheiro na variável lerficheiro
        '''
        try:
            # Lê o ficheiro e coloca os resultados na variável lerficheiro
            lerficheiro = open_workbook('IPC_Portugal_1977_2013.xls', 'r')
            pass
        except:
            # Se nao existir nenhum ficheiro faz o print 
            print("Não existe ficheiro")
            pass
        # Chamada da funcao que cria uma base de dados a partir da primeira folha lida do 
        # ficheiro exel
        self.criar_Base_De_Dados1(lerficheiro)
        pass
    
    def criar_Base_De_Dados1(self, lerficheiro):
        '''
        Funcão que vai criar uma base de dados a partir da folha Dados do ficheiro exel 
        lerficheiro - variavel onde esta guardado o conteudo do ficheiro exel
        '''
        
        # na linha a baixo vou guardar na variavel nome_das_folhas que é uma 
        # lista os nomes das folha do ficheiro exel
        nomes_das_folhas = lerficheiro.sheet_names()
        # guarda na variavel folha1 o nome da primeira folha do ficheiro exel 
        folha1 = lerficheiro.sheet_by_name(nomes_das_folhas[0])
        #Faz a conexão à base de dados
        base = sqlite3.connect('IPC_Portugal_1977_2013.db')
        cursor = base.cursor()

        #Verifica se a tabela já existe
        cursor.execute('''DROP TABLE IF EXISTS IPC_Portugal_1977_2013''')

        #Cria a tabela
        cursor.execute('''CREATE TABLE IPC_Portugal_1977_2013(COD_VAZIO null, COD_ANO number, COD_IPC_GLOBAL INT ,
                                                    COD_VARIACAO_ANUAL number, COD_REMUNERACAO_MINIMA_MENSAL number,
                                                    COD_REMUNERACAO_MAXIMA_MENSAL number, COD_PIB_PER_CAPITA number,
                                                    COD_RENDIMENTO_NACIONAL_BRUTO_PER_CAPITA number, COD_RENDIMENTO_DISPONIVEL_BRUTO_PER_CAPITA
                                                    number, COD_REMUNERACAO_PER_CAPITA_ANUAL)''')

        #Percorre o ficheiro e coloca os valores que foram lidos as suas variaveis
        for row in range(1, folha1.nrows):
            COD_VAZIO = folha1.cell(row, 0).value
            COD_ANO = folha1.cell(row, 1).value
            COD_IPC_GLOBAL = folha1.cell(row, 2).value
            COD_VARIACAO_ANUAL = folha1.cell(row, 3).value
            COD_REMUNERACAO_MINIMA_MENSAL  = folha1.cell(row, 4).value
            COD_REMUNERACAO_MAXIMA_MENSAL  = folha1.cell(row, 5).value
            COD_PIB_PER_CAPITA  = folha1.cell(row, 6).value
            COD_RENDIMENTO_NACIONAL_BRUTO_PER_CAPITA = folha1.cell(row, 7).value
            COD_RENDIMENTO_DISPONIVEL_BRUTO_PER_CAPITA = folha1.cell(row, 8).value
            COD_REMUNERACAO_PER_CAPITA_ANUAL = folha1.cell(row, 9).value
            
            #Insercao dos valores na base de dados
            cursor.execute('INSERT INTO IPC_Portugal_1977_2013 VALUES(?,?,?,?,?,?,?,?,?,?)',
                        (COD_VAZIO, COD_ANO, COD_IPC_GLOBAL, COD_VARIACAO_ANUAL, COD_REMUNERACAO_MINIMA_MENSAL,
                        COD_REMUNERACAO_MAXIMA_MENSAL, COD_PIB_PER_CAPITA, COD_RENDIMENTO_NACIONAL_BRUTO_PER_CAPITA,
                        COD_RENDIMENTO_DISPONIVEL_BRUTO_PER_CAPITA, COD_REMUNERACAO_PER_CAPITA_ANUAL))
        
        # Chamada da funcao que vai ler os dados da primeira folha exel
        self.ler_dados_da_base_de_dados_folha1(cursor)
        # Chamada da funcao que cria uma segunda base de dados a partir da segunda folha lida do 
        # ficheiro exel
        # Nas linhas a baixo faz -se o commit dos dados e feixa - se a base de dados. 
        base.commit()
        base.close()
        pass

   
    
    def ler_dados_da_base_de_dados_folha1(self, cursor):
        
        '''
        Neste método vou guardar os valores que li para as bases de dados e 
        vou guardar os valores nas seguintes variáveis:
        ano - é uma lista e vou lá guardar os valores dos anos para as estatisticas 
        ipcGlobal - é uma lista e vou lá guardar os anos para as estatisticas 
        variacaoAnual - é uma lista e vou lá guardar os valores da variacaoAnual para as estatisticas 
        remuneracaoMinimaMensal - é uma lista e vou lá guardar os valores da remuneracaoMinimaMensal para as estatisticas 
        remuneracaoMaximaMensal - é uma lista e vou lá guardar os valores da remuneracaoMaximaMensal para as estatisticas 
        pib - é uma lista e vou lá guardar os valores do pib para as estatisticas        
        rendimentoNacionalBrutoPerCapita - é uma lista e vou lá guardar os valores do rendimentoNacionalBrutoPerCapita para as estatisticas 
        rendimentoDisponivelBrutoPerCapita - é uma lista e vou lá guardar os valores do rendimentoDisponivelBrutoPerCapita para as estatisticas 
        remuneracaoPerCapitaAnual - é uma lista e vou lá guardar os valores da remuneracaoPerCapitaAnual para as estatisticas 
        '''
        ano = []
        ipcGlobal = []
        variacaoAnual = []
        remuneracaoMinimaMensal = []
        remuneracaoMaximaMensal = []
        pib = []        
        rendimentoNacionalBrutoPerCapita = []
        rendimentoDisponivelBrutoPerCapita = []
        remuneracaoPerCapitaAnual = []
        
        #Vou percorrer os COD_ANO da base IPC_Portugal_1977_2013, para guardar os valores nas variáveis acima referidas
        for row in cursor.execute('SELECT * FROM IPC_Portugal_1977_2013 WHERE COD_ANO '):
			#Guardo os valores nas respectivas variaveis
            ano.append(row[1])
            ipcGlobal.append(row[2])
            variacaoAnual.append(row[3])
            remuneracaoMinimaMensal.append(row[4])
            remuneracaoMaximaMensal.append(row[5])
            pib.append(row[6])
            rendimentoNacionalBrutoPerCapita.append(row[7])
            rendimentoDisponivelBrutoPerCapita.append(row[8])
            remuneracaoPerCapitaAnual.append(row[9])
        
        # Aqui faco as chamdas à classe Estatistica_Folha1
        for x in range(0, len(ano)):
            estatistica_folha1 = Estatistica_Folha1(ano[x], ipcGlobal[x], variacaoAnual[x], remuneracaoMinimaMensal[x],
                                       remuneracaoMaximaMensal[x], pib[x], rendimentoNacionalBrutoPerCapita[x],
                                       rendimentoDisponivelBrutoPerCapita[x], remuneracaoPerCapitaAnual[x], anoInicial, anoFinal)
        
        # Chamada às funcoes da classe Estatistica_Folha1
        estatistica_folha1.estatistica_ipc_global(ipcGlobal, ano)
        estatistica_folha1.estatistica_variacao_anual(variacaoAnual, ano, anoInicial, anoFinal)
        estatistica_folha1.estatistica_remuneracao_Minima_Anual(remuneracaoMinimaMensal, ano, anoInicial, anoFinal)
        estatistica_folha1.estatistica_remuneracao_Maxima_Anual(remuneracaoMaximaMensal, ano, anoInicial, anoFinal)
        estatistica_folha1.estatistica_remuneracao_Maxima_Minima_A_Precos_Constantes(ipcGlobal ,remuneracaoMaximaMensal, remuneracaoMinimaMensal, ano, anoInicial)
        estatistica_folha1.estatistica_pib(pib, ano, anoInicial, anoFinal)
        estatistica_folha1.estatistica_rendimento_Nacional_Bruto_Per_Capita(rendimentoNacionalBrutoPerCapita, ano, anoInicial, anoFinal)
        estatistica_folha1.estatistica_rendimento_Disponivel_Bruto_Per_Capita(rendimentoDisponivelBrutoPerCapita, ano, anoInicial, anoFinal)
        estatistica_folha1.estatistica_rendimento_Per_Capita_Anual(remuneracaoPerCapitaAnual, ano, anoInicial, anoFinal)
        pass
    
    

if __name__ == '__main__':
    '''
    Funcao Main - funcao que vai correr todo o programa
    '''
    # Na linha abaixo pergunto ao utilizador qual o ano inicial da estatistica
    # os valores que o utilizador pode introduzir podem variar entre 0, que corresponde ao ano 1977
    # e 36 que corresponde ao ano 2013
    anoInicial = input("Indique o ano inicial(0, 36):")
    # Na linha abaixo pergunto ao utilizador qual o ano final da estatistica
    # os valores que o utilizador pode introduzir podem variar entre 0, que corresponde ao ano 1977
    # e 36 que corresponde ao ano 2013
    anoFinal = input("Indique o ano final(0, 36):")
    # Na linha abaixo chamo a classe principal
    ler_e_escrever = Ler_Dados_E_Escrever(anoInicial, anoFinal)
    # Na linha abaixo chamo o metodo ler_fich_exel()  
    ler_e_escrever.ler_fich_exel()
    pass
